Для этого можно внести версию в корневой файл Directory.Packages.props. А внутри проектов писать нуггеты без версий.
<Project>
<ItemGroup>
<PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
<PackageVersion Include="Serilog" Version="2.10.0" />
</ItemGroup>
</Project>
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("YourTestProjectName")]
Является результатом работы GroupBy, можно итерироваться, хранит ключ группы и список элементов группы
GUID и UUID используют алгоритм именно байтовой генерации, а строки которые мы видим, это результат интерпретации байтов в алфавит из 16ти символов 0-9 A-F, а значит на олин символ уходит половина байта
Таким образом ключ состоящий из 32 символов весит 16 байт изначально
Но, если его сохранять в БД как строку то он начнет весить уже как Unicode строка, а значит будет весить как минимум 32 байта.
Таким образом, выгоднее сохранять в бд специальным типом UUID, а не строкой
Single возвращает единственный элемент, а значит кинет исключение если элементов нет или если их больше чем один
First кидает исключение только если элементов нет
Если есть необходимость всравнении строк без регистра и культурных символов, можно применять параметр
someString.Equal(otherString, StringComparison.InvariantCultureIgnoreCase)
В вижле можно нажать правую кнопку мыши на проект и нажать Manage User Secrets и откроется неотслеживаемый гитом файл secrets.json
config.Sources.Clear()
Чтобы красиво выбрасывать исключения по условиям, можно воспользоваться такой конструкцией
ArgumentNullException.ThrowIfNull(model)
В проектах на си шарп, при скачивании нугетов, зеркалами и пакетами можно управлять из общего конфига в AppData или из конфига в корне проекта/решения
Называться он должен Nuget.conf
В структурах дотнет меняет порядок полей для оптимизации, а вот в классах оставляет как есть для нормальной работы GC.
Это применяется когда нужна пагинация на гигаобъеме данных
в таком случае, даже в пристуствии индекса на поле, для запроса
SELECT * FROM elements ORDER BY created_at LIMIT 100 OFFSET 100_000_000
Будет произведен перебор 100_000_000 элементов
Но дерево работает быстрее на поиск, поэтому можно просить пользователя отдавать не просто номер страницы но и значение последнего элемента и запрос преобразовать в
SELECT * FROM elements WHERE created_at > 'some_value' ORDER BY created_at LIMIT 100 OFFSET 100_000_000
В таком случае мы быстро по дереву найдем нужное значение и просто быстро достанем все следующие.
global using System;
После этого, компилятор будет знать что во всем проекте применяется этот путь к типам.